import {BaseEntity} from '../core/BaseEntity';
import {ColumnInfo} from "../types";

/**
 * 实体默认值处理工具类
 * 负责处理实体对象中未设置值的字段的默认值
 */
export class EntityDefaultValueUtils {
  /**
   * 为实体对象中未设置的字段应用默认值
   *
   * @param entity 原始实体对象（部分字段可能未设置）
   * @param columns 表中所有列的定义
   * @returns 应用了默认值的完整实体对象
   */
  public static applyDefaultValues<T extends BaseEntity>(entity: Partial<T>, columns: Record<keyof T, ColumnInfo>): Partial<T> {
    // 创建完整的实体对象，包含所有表中定义的字段
    const completeEntity: Partial<T> = {};

    // 遍历表中所有的列，确保每个字段都有值
    for (const columnName in columns) {
      const column = columns[columnName];
      const key = columnName as keyof T;

      // 如果实体中提供了该字段的值，直接使用
      if (key in entity) {
        completeEntity[key] = entity[key];
      }
      // 否则，尝试应用默认值或null
      else {
        // 如果列有默认值定义，使用该默认值
        if ('default' in column) {
          completeEntity[key] = column.default as any;
        }
        // 自增主键不需要值
        else if (column.primaryKey && column.autoIncrement) {
          // 不设置值，让SQLite自动处理
        }
        // 对于配置了generateId的字段，会在processAutoId中处理
        else if (column.generateId) {
          // 不需要显式设置值，会在processAutoId中处理
        }
        // 否则，设为null或适当的默认值
        else {
          completeEntity[key] = this.getDefaultValueByType(column.type);
        }
      }
    }

    return completeEntity;
  }

  /**
   * 根据SQLite数据类型获取适当的默认值
   *
   * @param type SQLite数据类型
   * @returns 该类型的默认值
   */
  private static getDefaultValueByType(type: string): any {
    switch (type) {
      case 'INTEGER':
        return 0;
      case 'REAL':
        return 0.0;
      case 'TEXT':
        return '';
      case 'BLOB':
      default:
        return null;
    }
  }
}
